#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include "server/server.h"
#include "client/client.h"

Server *s = NULL;
Client *c = NULL;

void int_called(int sig) {
	printf("Ctrl-C Called\n");
	if(s) {
		s->stop();
		delete s;
		s = NULL;
	}
	if(c) {
		c->stop();
		delete c;
		c = NULL;
	}
	exit(0);
}

int main(int argc, char **argv) {
	
	signal(SIGINT, int_called);
	
	int i, server=0, port=0, eroare=0;
	char *filename = 0, *hostname = 0, *username = 0, *password = 0;

	// Citeste parametrii din linia de comanda
	for(i=1; i<argc; i++) {
		if(!strcmp(argv[i],"-s")) {
			/* Este pornit ca server */
			if(server != 0) {
				eroare = 1;
				break;
			}
			server = 1;
		}
		if(!strcmp(argv[i],"-port")) {
			// Urmatorul argument trebuie sa fie portul: fie cel pe care asculta serverul, fie cel la care se conecteaza clientul
			if(port != 0 || i+1>=argc || sscanf(argv[++i],"%d",&port)!=1) {
				eroare = 2;
				break;
			}
		}
		if(!strcmp(argv[i],"-h")) {
			// Urmatorul argument trebuie sa fie hostname-ul la care se conecteaza clientul
			if(hostname != 0 || i+1>=argc) {
				eroare = 3;
				break;
			}
			hostname = argv[++i];
		}
		if(!strcmp(argv[i],"-f")) {
			// Urmatorul argument trebuie sa fie fisierul ce contine userii si parolele pentru server
			if(filename != 0 || i+1>=argc) {
				eroare = 4;
				break;
			}
			filename = argv[++i];
		}
		if(!strcmp(argv[i],"-u")) {
			// Urmatorul argument trebuie sa fie usernameul utilizatorului
			if(username != 0 || i+1>=argc) {
				eroare = 5;
				break;
			}
			username = argv[++i];
		}
		if(!strcmp(argv[i],"-p")) {
			// Urmatorul argument trebuie sa fie parola utilizatorului
			if(password != 0 || i+1>=argc) {
				eroare = 6;
				break;
			}
			password = argv[++i];
		}
	}

	if(!eroare) {
		if(server) {
			// Este pornit ca server
			if(port==0 || filename==0) {
				// Testeaza daca sunt prezenti toti parametrii
				eroare = 5;
			}
		} else {
			// Este pornit ca client
			if(hostname==0 || port==0 || username==0 || password==0) {
				// Testeaza daca sunt prezenti toti parametrii
				eroare = 6;
			}
		}
	}

	if(eroare) {
		// S-a produs o eroare: nu a fost apelat corect
		printf("[Error no %d]: Correct usage:\n", eroare);
		printf("SERVER:\n  %s -s -port <port_number> -f <filename>\n", argv[0]);
		printf("CLIENT:\n  %s -h <server_hostname> -port <server_port_number> -u <username> -p <password>\n", argv[0]);
        return eroare;
	}

	if(server) {
		// Porneste server
		s = new Server(port, filename);
		s->start();
		delete s;
		s = NULL;
	} else {
		// Porneste client
		c = new Client(hostname, port, username, password);
		c->start();
		delete c;
		c = NULL;
	}

	return 0;
}
